#include "seq_list.h"

// 创建顺序表的函数--通过返回值实现
list_t *create_list_1(){
    // 分配空间
    list_t *p = (list_t *)malloc(sizeof(list_t));
    if(NULL == p){
        printf("内存分配失败\n");
        return NULL;
    }
    // 初始化分配的空间 (count置0)
    p->count = 0;
    return p;
}

// 创建顺序表的函数--通过地址传参实现
int create_list_2(list_t **p){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    // 分配空间
    *p = (list_t *)malloc(sizeof(list_t));
    if(NULL == *p){
        printf("内存分配失败\n");
        return -1;
    }
    // 初始化分配的空间 (count置0)
    (*p)->count = 0;
    return 0;
}

// 向顺序表插入元素 (尾插)
int insert_list_by_tail(list_t *p, int value){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    if(N == p->count){
        printf("表已满 插入失败\n");
        return -1;
    }
    p->data[p->count].num = value;
    p->count++;
    return 0;
}

// 打印顺序表中的所有元素----实际不需要，只是学习阶段用来看现象的
int print_list(list_t *p){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    int i = 0;
    for(i = 0; i < p->count; i++){
        printf("%d  ", p->data[i].num);
    }
    printf("\n");
    return 0;
}

// 向顺序表插入元素 (任意位置插入)
int insert_list_by_position(list_t *p, int position, int value){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    if(N == p->count){
        printf("表已满 插入失败\n");
        return -1;
    }
    if(position < 0 || position > p->count){
        printf("位置不合理 插入失败\n");
        return -1;
    }
    // 执行插入操作
    int i = 0;
    for(i = p->count-1; i >= position; i--){
        p->data[i+1] = p->data[i];
    }
    p->data[position].num = value;
    p->count++;
    return 0;
}

// 删除顺序表中的元素(尾删)
int delete_list_by_tail(list_t *p){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    if(0 == p->count){
        printf("表为空 删除失败\n");
        return -1;
    }
    // 只需要count--即可
    p->count--;
    return 0;
}

// 删除顺序表中的元素(任意位置删)
int delete_list_by_position(list_t *p, int position){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    if(0 == p->count){
        printf("表为空 删除失败\n");
        return -1;
    }
    if(position < 0 || position >= p->count){
        printf("位置不合理 删除失败\n");
        return -1;
    }
    // 执行删除操作
    int i = 0;
    for(i = position; i < p->count-1; i++){
        p->data[i] = p->data[i+1];
    }
    p->count--;
    return 0;
}

// 修改指定位置的元素
int modify_list_by_position(list_t *p, int position, int new_value){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    if(position < 0 || position >= p->count){
        printf("位置不合理 修改失败\n");
        return -1;
    }
    p->data[position].num = new_value;
    return 0;
}

// 查找指定位置的元素
// 这种函数的功能：找不到报错  找到了应该将找到的数据给调用处 而不是打印到终端
int search_list_by_position(list_t *p, int position, int *buff){
    // 入参合法性检查
    if(NULL == p || NULL == buff){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    if(position < 0 || position >= p->count){
        printf("指定的位置没有数据 查找失败\n");
        return -1;
    }
    *buff = p->data[position].num;
    return 0;
}

// 清空顺序表
int clean_list(list_t *p){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    p->count = 0;
    return 0;
}

// 销毁顺序表
int destroy_list(list_t **p){
    if(NULL == p || NULL == *p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    free(*p);
    *p = NULL;
    return 0;
}

// 顺序表排序 --flag用来控制升序和降序  传0 升序 传1 降序
int sort_list(list_t *p, int flag){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    int i=0;
    int j=0;
    int temp=0;
    for(i=0;i<p->count-1;i++){
        for(j=0;j<(p->count)-1-i;j++){
            if(1==flag){
                if((p->data[j].num)<p->data[j+1].num){
                temp=p->data[j].num;
                p->data[j].num=p->data[j+1].num;
                p->data[j+1].num=temp;
                }else if(0==flag){
                    temp=p->data[j].num;
                    p->data[j].num=p->data[j+1].num;
                    p->data[j+1].num=temp;
                }else{
                    printf("输入错误");
                    return -1;
                }
            }
        }
    }
    return 0;
}


// 顺序表剔重
int tichong_list(list_t *p){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }   
    int i=0;
    int j=0;
    int k=0;
    for(i=0;i<p->count-1;i++){
        for(j=i+1;j<p->count;j++){
            if(p->data[i].num==p->data[j].num){
                for(k = j; k < p->count-1; k++){
                    p->data[k].num = p->data[k+1].num;
                }
                p->count--;  
                j--;         
            }
        }
    }
    return 0;  
}